﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NHTU;
using NOMFinalSettlement.Classes;

namespace NOMFinalSettlement.AppForm.Program
{
    public partial class fReportExport : DevComponents.DotNetBar.Office2007Form
    {
        FinalSettlementModel.TableHoSo profileDB = null;
        FinalSettlementModel.TableNhomCongTrinh groupProjectDB = null;
        FinalSettlementModel.TableQuyetDinhDauTu acceptInvestmentDB = null;
        FinalSettlementModel.TableChuDauTu investorDB = null;
        FinalSettlementModel.TableHinhThucChonThau constructDB = null;
        FinalSettlementModel.TableCanBo examineDB = null;
        FinalSettlementModel.TableNguonVon capitalDB = null;
        FinalSettlementModel.TablePheDuyet approveDB = null;
        FinalSettlementModel.TableNguonVon_PheDuyet capitalApproveDB = null;
 
        int idApproveSelected = -1;
        int idProfileSelect = -1;

        IQueryable<FinalSettlementModel.TableHoSo.reportHoSo> profile = null;

        string formatMoney = "{0:0,0.00}";

        public fReportExport()
        {
            InitializeComponent();
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            if (bgw.IsBusy != true)
            {
                bgw.RunWorkerAsync("doSearch");
            }
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            if (bgw.IsBusy != true)
            {                
                bgw.RunWorkerAsync("doExport");
            }
        }

        private void fReportExport_Load(object sender, EventArgs e)
        {
            btnDelete.Enabled = false;
            //Khoi tạo lớp model của TableHoSo_PheDuyet
            profileDB = new FinalSettlementModel.TableHoSo();
            approveDB = new FinalSettlementModel.TablePheDuyet();
            // Khởi tạo lớp model của TableNhomCongTrinh
            groupProjectDB = new FinalSettlementModel.TableNhomCongTrinh();
            doLoadDataComboboxGroupProject();
            // Khởi tạo lớp model của TableQuyetDinhDauTu
            acceptInvestmentDB = new FinalSettlementModel.TableQuyetDinhDauTu();
            doLoadDataComboboxAcceptInvestment();
            // Khởi tạo lớp model của TableChuDauTu
            investorDB = new FinalSettlementModel.TableChuDauTu();
            doLoadDataComboboxInvestor();
            // Khởi tạo lớp model của TableHinhThucChonThau
            constructDB = new FinalSettlementModel.TableHinhThucChonThau();
            doLoadDataComboboxConstructName();
            // Khởi tạo lớp model của TableCanBo
            examineDB = new FinalSettlementModel.TableCanBo();
            doloadDataListUser();
            // Khởi tạo lớp model của TableNguonVon
            capitalDB = new FinalSettlementModel.TableNguonVon();
            capitalApproveDB = new FinalSettlementModel.TableNguonVon_PheDuyet();
            doloadCapitalInvestment();
        }
        //Data to Commbobox
        void doLoadDataComboboxGroupProject()
        {
            cbbGroupProject.DataSource = groupProjectDB.ListGroupObjectData();
            cbbGroupProject.DisplayMember = "NhomCongTrinh";
            cbbGroupProject.ValueMember = "ID";
            cbbGroupProject.Text = "";
        }
        void doLoadDataComboboxAcceptInvestment()
        {
            cbbAcceptInvestment.DataSource = acceptInvestmentDB.ListInvestmentData();
            cbbAcceptInvestment.DisplayMember = "QuyetDinhDauTu";
            cbbAcceptInvestment.ValueMember = "ID";
            cbbAcceptInvestment.Text = "";
        }
        void doLoadDataComboboxInvestor()
        {
            cbbInvestor.DataSource = investorDB.ListInvestorData();
            cbbInvestor.DisplayMember = "ChuDauTu";
            cbbInvestor.ValueMember = "ID";
            cbbInvestor.Text = "";
        }
        void doLoadDataComboboxConstructName()
        {
            cbbConstructName.DataSource = constructDB.ListBidData();
            cbbConstructName.DisplayMember = "HinhThucChonThau";
            cbbConstructName.ValueMember = "ID";
            cbbConstructName.Text = "";
        }
        void doloadDataListUser()
        {
            cbbExamineUser.DataSource = examineDB.ListOfficerData();
            cbbExamineUser.DisplayMember = "CanBo";
            cbbExamineUser.ValueMember = "ID";
            cbbExamineUser.Text = "";
        }
        void doloadCapitalInvestment()
        {
            DataTable listCap = capitalDB.ListCapitalData();
            foreach(DataRow cap in listCap.Rows)
            {
                dataGridCapitalInvestment.Rows.Add(cap["ID"], cap["NguonVon"]);
            }
        }

        void doExport()
        {
            Invoke(new MethodInvoker(() => btnExport.Enabled = false), null);
            SaveFileDialog f = new SaveFileDialog();
            f.Filter = "Excel file (*.xls)|*.xls";
            if (f.ShowDialog() == DialogResult.OK)
            {
                exportToExcel.exportDataToExcel("DANH SÁCH THỐNG KÊ CHI TIẾT HỒ SƠ", convertToDatatable(dataViewProfile), f.FileName.ToString());
                Invoke(new MethodInvoker(() =>MsgBox.Show("Báo cáo đã được tạo mới tại " + f.FileName.ToString(), "Thông Báo", MsgBoxButton.Ok, MsgBoxIcon.Success)),null);
            }
            Invoke(new MethodInvoker(() => btnExport.Enabled = true),null);
        }

        private DataTable convertToDatatable(DataGridView dgv)
        {            
            DataTable dt = new DataTable();
            foreach (DataGridViewColumn column in dgv.Columns)
            {
                dt.Columns.Add(column.HeaderText);
            }
            object[] cellValues = new object[dgv.Columns.Count];
            foreach (DataGridViewRow row in dgv.Rows)
            {
                for (int i = 0; i < row.Cells.Count; i++)
                {
                    cellValues[i] = row.Cells[i].Value;
                }
                dt.Rows.Add(cellValues);
            }
            return dt;
        } 

        void doSearch()
        {            
            profile = profileDB.listProfile();

            //NULL
            //Kiểm tra tên công trình
            var _txtProjectName = IsText(txtProjectName);
            if (!string.IsNullOrEmpty(_txtProjectName))
            {
                profile = profile.Where(w => w.TenDuAn.Contains(_txtProjectName));
            }
            //Kiểm tra số lưu
            var _txtCode = IsText(txtCode);
            if (!string.IsNullOrEmpty(_txtCode))
            {
                profile = profile.Where(w => w.SoLuu.Contains(_txtCode));
            }

            //Kiểm tra mã dự án
            var _txtProjectCode = IsText(txtProjectCode);
            if (!string.IsNullOrEmpty(_txtProjectCode))
            {
                profile = profile.Where(w => w.MaDuAn == txtProjectCode.Value);
            }

            //Kiểm tra nhóm công trình
            var _cbbGroupProject = IsText(cbbGroupProject);
            if (!string.IsNullOrEmpty(_cbbGroupProject))
            {
                profile = profile.Where(w => w.NhomCongTrinh == _cbbGroupProject);
            }

            //Kiểm tra Cấp quyết định đầu tư
            var _cbbAcceptInvestment = IsText(cbbAcceptInvestment);
            if (!string.IsNullOrEmpty(_cbbAcceptInvestment))
            {
                profile = profile.Where(w => w.QuyetDinhDauTu == _cbbAcceptInvestment);
            }

            //Kiểm tra chủ đầu tư
            var _cbbInvestor = IsText(cbbInvestor);
            if (!string.IsNullOrEmpty(_cbbInvestor))
            {
                profile = profile.Where(w => w.ChuDauTu == _cbbInvestor);
            }

            //Kiểm tra hình thức chọn thầu
            var _cbbConstructName = IsText(cbbConstructName);
            if (!string.IsNullOrEmpty(_cbbConstructName))
            {
                profile = profile.Where(w => w.HinhThucChonThau == _cbbConstructName);
            }

            //Kiểm tra Cán bộ thẩm tra
            var _cbbExamineUser = IsText(cbbExamineUser);
            if (!string.IsNullOrEmpty(_cbbExamineUser))
            {
                profile = profile.Where(w => w.CanBo == _cbbExamineUser);
            }

            //Kiểm tra Địa điểm thực hiện
            var _txtLocation = IsText(txtLocation);
            if (!string.IsNullOrEmpty(_txtLocation))
            {
                profile = profile.Where(w => w.DiaDiem.Contains(_txtLocation));
            }

            //Kiểm tra Quy mô đầu tư
            var _txtScale = IsText(txtScale);
            if (!string.IsNullOrEmpty(_txtScale))
            {
                profile = profile.Where(w => w.QuyMoDauTu.Contains(_txtScale));
            }

            //Kiểm tra Phê duyệt quyết toán
            var _txtDocSignFinal = IsText(txtDocSignFinal);
            if (!string.IsNullOrEmpty(_txtDocSignFinal))
            {
                profile = profile.Where(w => w.VanBanPheDuyet.Contains(_txtDocSignFinal));
            }
                        
            //Kiểm tra Trình ký
            var _cbbApplySign = IsText(cbbApplySign);
            if (!string.IsNullOrEmpty(_cbbApplySign))
            {
                //Trường hợp đã trình ký
                if (_cbbApplySign == "Đã trình ký")
                {
                    profile = profile.Where(w => w.TrinhKy == "Đã trình ký");
                }
                //Trường hợp chưa trình ký
                if (_cbbApplySign == "Chưa trình ký")
                {
                    profile = profile.Where(w => w.TrinhKy == "Chưa trình ký");
                }
            }

            //Kiểm tra Hoàn thành
            var _cbbFinish = IsText(cbbFinish);
            if (!string.IsNullOrEmpty(_cbbFinish))
            {
                //Trường hợp đã trình ký
                if (_cbbFinish == "Đã hoàn thành")
                {
                    profile = profile.Where(w => w.HoanThanhQuyetToan == "Đã hoàn thành");
                }
                //Trường hợp chưa trình ký
                if (_cbbFinish == "Chưa hoàn thành")
                {
                    profile = profile.Where(w => w.HoanThanhQuyetToan == "Chưa hoàn thành");
                }
            }


            // Between ---------------------------------------------------------------->
            //Kiểm tra ngày nhận hồ sơ
            var _dateAddDocStart = IsText(dateAddDocStart);
            var _dateAddDocEnd = IsText(dateAddDocEnd);
            if (IsValidDate(_dateAddDocStart, _dateAddDocEnd))
            {
                profile = profile.Where(w => w.NgayNhan >= dateAddDocStart.Value && w.NgayNhan <= dateAddDocEnd.Value);
            }

            // Kiểm tra nhập Tổng dự án
            var _totalProjectStart = IsText(totalProjectStart);
            var _totalProjectEnd = IsText(totalProjectEnd);
            if (IsValidDecimal(_totalProjectStart, _totalProjectEnd))
            {
                profile = profile.Where(w => w.TongDuAn >= (decimal)totalProjectStart.Value && w.TongDuAn <= (decimal)totalProjectStart.Value);
            }

            // Kiểm tra nhập Tổng dự toán
            var _totalEstimatesStart = IsText(totalEstimatesStart);
            var _totalEstimatesEnd = IsText(totalEstimatesEnd);
            if (IsValidDecimal(_totalEstimatesStart, _totalEstimatesEnd))
            {
                profile = profile.Where(w => w.TongDuToan >= (decimal)totalEstimatesStart.Value && w.TongDuAn <= (decimal)totalEstimatesEnd.Value); 
            }

            // Kiểm tra nhập Chủ đầu tư đề nghị QT
            var _totalSettlementStart = IsText(totalSettlementStart);
            var _totalSettlementEnd = IsText(totalSettlementEnd);
            if (IsValidDecimal(_totalSettlementStart, _totalSettlementEnd))
            {
                profile = profile.Where(w => w.DeNghiGiaTriQuyetToan >= (decimal)totalSettlementStart.Value && w.TongDuAn <= (decimal)totalSettlementEnd.Value);  
            }

            //Kiểm tra ngày khởi công
            var _dateStartStart = IsText(dateStartStart);
            var _dateStartEnd = IsText(dateStartEnd);
            if (IsValidDate(_dateStartStart, _dateStartEnd))
            {
                profile = profile.Where(w => w.TGKhoiCong >= dateStartStart.Value && w.TGKhoiCong <= dateStartEnd.Value); 
            }

            //Kiểm tra ngày hoàn thành
            var _dateFinishStart = IsText(dateFinishStart);
            var _dateFinishEnd = IsText(dateFinishEnd);
            if (IsValidDate(_dateFinishStart, _dateFinishEnd))
            {
                profile = profile.Where(w => w.TGHoanThanh >= dateFinishStart.Value && w.TGHoanThanh <= dateFinishEnd.Value);
            }

            // Kiểm tra nhập Giá trị quyết toán được duyệt
            var _inputTotalSettlementStart = IsText(inputTotalSettlementStart);
            var _inputTotalSettlementEnd = IsText(inputTotalSettlementEnd);
            if (IsValidDecimal(_inputTotalSettlementStart, _inputTotalSettlementEnd))
            {
                profile = profile.Where(w => w.GiaTriQuyetToan >= (decimal)inputTotalSettlementStart.Value && w.GiaTriQuyetToan <= (decimal)inputTotalSettlementEnd.Value);
            }

            //Kiểm tra ngày phê duyệt QT
            var _dateSignFinalStart = IsText(dateSignFinalStart);
            var _dateSignFinalEnd = IsText(dateSignFinalEnd);
            if (IsValidDate(_dateSignFinalStart, _dateSignFinalEnd))
            {
                profile = profile.Where(w => w.NgayPheDuyet >= dateSignFinalStart.Value && w.NgayPheDuyet <= dateSignFinalEnd.Value); 
            }

            // Kiểm tra nhập Phí thẩm tra, phê quyệt quyết
            var _txtSignFinalPriceStart = IsText(txtSignFinalPriceStart);
            var _txtSignFinalPriceEnd = IsText(txtSignFinalPriceEnd);
            if (IsValidDecimal(_txtSignFinalPriceStart, _txtSignFinalPriceEnd))
            {
                profile = profile.Where(w => w.PhiThamTra >= (decimal)txtSignFinalPriceStart.Value && w.PhiThamTra <= (decimal)txtSignFinalPriceEnd.Value);
            }

            //Kiểm tra Nguồn vốn
            string[] searchCapital = new string[dataGridCapitalInvestment.Rows.Count];
            int i = 0;
            foreach (DataGridViewRow row in dataGridCapitalInvestment.Rows)
            {
                if (row.Cells["CHECKNV"] != null && row.Cells["CHECKNV"].Value != null && (bool)(row.Cells["CHECKNV"].Value) == true)
                {
                    searchCapital[i] = row.Cells[0].Value.ToString();
                    i++;
                }                                   
            }
            searchCapital = searchCapital.Where(w => !String.IsNullOrEmpty(w)).ToArray();
            if (searchCapital.Count() > 0)
            {
                profile = profile.Where(w => searchCapital.Contains(w.NguonVonID));
            }

            loadDataToGridProfile(profile);
        }

        void loadDataToGridProfile(IQueryable<FinalSettlementModel.TableHoSo.reportHoSo> dataReport)
        {
            Invoke(new MethodInvoker(() => btnExport.Enabled = (dataReport.Count() > 0) ? true : false), null);
            Invoke(new MethodInvoker(() => dataViewProfile.Rows.Clear()), null);
            foreach (var rowProfile in dataReport)
            {
                Invoke(new MethodInvoker(() => dataViewProfile.Rows.Add(rowProfile.HoSoID, 
                    rowProfile.SoLuu, 
                    rowProfile.TenDuAn,
                    rowProfile.MaDuAn,
                    rowProfile.NhomCongTrinh,
                    rowProfile.QuyetDinhDauTu,
                    rowProfile.ChuDauTu,
                    rowProfile.NgayNhan.ToShortDateString(),
                    String.Format(formatMoney,rowProfile.TongDuAn),
                    String.Format(formatMoney,rowProfile.TongDuToan),
                    String.Format(formatMoney,rowProfile.DeNghiGiaTriQuyetToan),
                    rowProfile.HinhThucChonThau,
                    rowProfile.CanBo,
                    rowProfile.DiaDiem,
                    (rowProfile.TGKhoiCong == null) ? "" : rowProfile.TGKhoiCong.Value.ToShortDateString(),
                    (rowProfile.TGHoanThanh == null) ? "" : rowProfile.TGHoanThanh.Value.ToShortDateString(),
                    rowProfile.QuyMoDauTu,
                    String.Format(formatMoney,rowProfile.GiaTriQuyetToan),
                    String.Format(formatMoney,rowProfile.ChiPhiXayDung),
                    String.Format(formatMoney,rowProfile.ChiPhiThietBi),
                    String.Format(formatMoney,rowProfile.ChiPhiQLDA),
                    String.Format(formatMoney,rowProfile.ChiPhiTVDT),
                    String.Format(formatMoney,rowProfile.ChiPhiBTGPMB),
                    String.Format(formatMoney,rowProfile.ChiPhiKhac),
                    rowProfile.TrinhKy,
                    (rowProfile.NgayPheDuyet == null) ? "" : rowProfile.TGHoanThanh.Value.ToShortDateString(),
                    rowProfile.VanBanPheDuyet,
                    rowProfile.PhiThamTra,
                    rowProfile.HoanThanhQuyetToan,
                    rowProfile.PheDuyetID
                    )), null);                
            }
        }

        string IsText(Control c)
        {
            var _self = MainApp.Self.appProcess;
            return _self.crossText(c);
        }

        bool IsValidDate(string dateStart, string dateEnd)
        {
            if (!string.IsNullOrEmpty(dateStart) && !string.IsNullOrEmpty(dateEnd))
            {
                if (DateTime.Parse(dateEnd) > DateTime.Parse(dateStart))
                {
                    return true;
                }
                else MsgBox.Show("Lỗi nhập ngày !", "Thông báo", MsgBoxButton.Ok, MsgBoxIcon.Stop);
            }
            return false;
        }
        bool IsValidDecimal(string numberStart, string numberEnd)
        {
            if (!string.IsNullOrEmpty(numberStart) && !string.IsNullOrEmpty(numberEnd))
            {
                if (DateTime.Parse(numberEnd) > DateTime.Parse(numberStart))
                {
                    return true;
                }
                else MsgBox.Show("Lỗi nhập giá trị !", "Thông báo", MsgBoxButton.Ok, MsgBoxIcon.Stop);
            }
            return false;
        }

        private void timerLoading_Tick(object sender, EventArgs e)
        {
            circularProgress.Value += 2;
        }

        private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            EnableCircular(false);
        }

        private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

        }

        private void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            EnableCircular(true);           
            if (e.Argument.ToString() == "doSearch")
            {
                doSearch();
            }
            else
            {
                System.Threading.Thread newThread = new System.Threading.Thread(new System.Threading.ThreadStart(doExport));
                newThread.SetApartmentState(System.Threading.ApartmentState.STA);
                newThread.Start();
            }
        }

        void EnableCircular(bool enable)
        {
            this.Invoke((MethodInvoker)delegate
            {
                circularProgress.Visible = enable;
                circularProgress.IsRunning = enable;
                if (enable)
                {
                    btnSearch.Enabled = false;
                    lbStatus.Text = " Đang xử lý ...";
                    timerLoading.Start();
                }
                else 
                {
                    btnSearch.Enabled = true;
                    lbStatus.Text = "";
                    timerLoading.Stop();
                }
            });        
        }

        private void dataViewProfile_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            idProfileSelect = MainApp.Self.appProcess.getIdGrid(dataViewProfile, e, ctMenu);
            DataGridViewSelectedRowCollection rowSelected = dataViewProfile.SelectedRows;
            if (idProfileSelect < 1)
            {
                btnDelete.Enabled = false;
                idApproveSelected = -1;
            }
            else
            {
                btnDelete.Enabled = true;
                foreach (DataGridViewRow row in rowSelected)
                {
                    if (row.Cells["IDPD"] != null && row.Cells["IDPD"].Value != null)
                    {
                        idApproveSelected = (int)row.Cells["IDPD"].Value;
                    }
                }
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (MsgBox.Show("Bạn có chắc chắn muốn xoá dữ liệu này không ?", "Thông Báo",
                 MsgBoxButton.YesNo, MsgBoxIcon.Question) == MsgBoxResult.Yes)
            {
                if (idApproveSelected > 0)
                {
                    capitalApproveDB.deleteCapital_Approve(idApproveSelected);
                    approveDB.deleteApprove(idApproveSelected);
                }
                profileDB.deleteProfile(idProfileSelect);
                loadDataToGridProfile(profile);
            }
        }

        private void menuDelete_Click(object sender, EventArgs e)
        {
            btnDelete_Click(sender, e);
        }
    }
}
